using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using EYDIngenieria.ERP.Aplicacion.Gestion;
using EYDIngenieria.ERP.Aplicacion.Mantenedores;
using EYDIngenieria.ERP.ObjetosDeNegocio.Dominio;
using EYDIngenieria.ERP.ObjetosDeNegocio.Repositorio;

public partial class Gestion_IngresoOC : System.Web.UI.Page
{
    private MantenedorProducto mantenedorProducto = new MantenedorProducto();
    private MantenedorFamiliaProducto mantenedorFamiliaProducto = new MantenedorFamiliaProducto();
    private MantenedorProveedor mantenedorProveedor = new MantenedorProveedor();
    private MantenedorEstadoOrdenDeCompra mantenedorEstadoOrdenDeCompra = new MantenedorEstadoOrdenDeCompra();
    private GestionOrdenDeCompra gestionOrdenDeCompra = new GestionOrdenDeCompra();
    private Producto[] productos;
    private FamiliaProducto[] familiasDeProducto;
    private Proveedor[] proveedores;
    private OrdenDeCompra oc = new OrdenDeCompra();
    private DetalleOrdenDeCompra[] detalleOrdenDeCompra;
    private ListItem _li = new ListItem("Seleccione", "0");
    private  RepositorioDetalleOrdenDeCompra repositorioDetalleOrdenDecompra = new RepositorioDetalleOrdenDeCompra();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session.Keys.Count == 0)
            Response.Redirect("../Default.aspx");
       
        if (!IsPostBack)
        {
            Session.Add("OC",oc);
            ddlProveedor.DataTextField = "RazonSocial";
            ddlProveedor.DataValueField = "Id";
            proveedores = mantenedorProveedor.Listar();
            ddlProveedor.DataSource = proveedores;
            ddlProveedor.DataBind();
           
            ddlProveedor.Items.Insert(0,_li);

            ddlFamilia.DataTextField = "Nombre";
            ddlFamilia.DataValueField = "Id";
            familiasDeProducto = mantenedorFamiliaProducto.Listar();
            familiasDeProducto = familiasDeProducto;
            ddlFamilia.DataSource = familiasDeProducto;
            ddlFamilia.DataBind();
            ddlFamilia.Items.Insert(0, _li);

            ddlProducto.DataTextField = "Nombre";
            ddlProducto.DataValueField = "Id";
            ddlProducto.DataSource = productos;
            ddlProducto.DataBind();
            ddlProducto.Items.Insert(0, _li);

            lblFecha.Text = DateTime.Now.ToShortDateString();
            gdvDetalleOC.DataSource = oc.Detalle;
            gdvDetalleOC.DataBind();

            CargarListaOrdenes();
        }
        btnFinalizar.Enabled = gdvDetalleOC.Rows.Count > 0;
    }

    private void CargarListaOrdenes()
    {
        lbxOrdenes.Items.Clear();
        OrdenDeCompra[] ordenes = gestionOrdenDeCompra.Listar(mantenedorEstadoOrdenDeCompra.Buscar("R")[0]);

        ListItem l;
        foreach (OrdenDeCompra oc in ordenes)
        {
            l = new ListItem(string.Format("{0} - {1} - {2}", oc.Id.ToString(), oc.Proveedor.RazonSocial, oc.Fecha.ToString("dd-MM-yyyy")), oc.Id.ToString());
            lbxOrdenes.Items.Add(l);
        }

        ordenes = gestionOrdenDeCompra.Listar(mantenedorEstadoOrdenDeCompra.Buscar("I")[0]);
        foreach (OrdenDeCompra oc in ordenes)
        {
            l = new ListItem(string.Format("{0} - {1} - {2}", oc.Id.ToString(), oc.Proveedor.RazonSocial, oc.Fecha.ToString("dd-MM-yyyy")), oc.Id.ToString());
            lbxOrdenes.Items.Add(l);
        }
    }

    protected void ddlFamilia_SelectedIndexChanged(object sender, EventArgs e)
    {
        FamiliaProducto f = new FamiliaProducto();
        f.Id = Int16.Parse(((DropDownList)sender).SelectedValue);
        productos = mantenedorProducto.Listar(f);
        ListItem liProducto;
        ddlProducto.Items.Clear();
        ddlProducto.DataValueField = "Id";
        foreach (Producto producto in productos)
        {
            liProducto = new ListItem(producto.Codigo +"-"+producto.Nombre,producto.Id.ToString());
            ddlProducto.Items.Add(liProducto);
        }
        //ddlProducto.DataSource = productos;

        ddlProducto.Items.Insert(0,_li);
    }
    protected void ddlProducto_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
    protected void btnAgregar_Click(object sender, EventArgs e)
    {
        DetalleOrdenDeCompra doc;
        if (((DetalleOrdenDeCompra)Session["DETALLEOCEDICION"])!=null)
        {
            doc = ((DetalleOrdenDeCompra) Session["DETALLEOCEDICION"]);
            doc.ValorUnitario = long.Parse(txbValorUnitario.Text);
            doc.ValorTotal = doc.ValorTotal*doc.Cantidad;
            repositorioDetalleOrdenDecompra.Modificar(doc);
            CargaOrden();
            txbValorUnitario.Text = "0";
            txbCantidad.Text = "0";
            ddlProducto.Items.Clear();
            ddlFamilia.SelectedIndex = 0;
            gestionOrdenDeCompra.ActualizaMontoTotal(doc.OrdenDeCompra);
            return;
        }
        long montoTotal = 0;
         doc = new DetalleOrdenDeCompra();
        doc.Cantidad = long.Parse(txbCantidad.Text);
        doc.ValorUnitario = long.Parse(txbValorUnitario.Text==""?"0":txbValorUnitario.Text);
        doc.ValorTotal = doc.Cantidad*doc.ValorUnitario;
        doc.Producto = mantenedorProducto.Obtener(int.Parse(ddlProducto.SelectedValue));
        ((OrdenDeCompra) Session["OC"]).Detalle.Add(doc);
        gdvDetalleOC.DataSource = ((OrdenDeCompra)Session["OC"]).Detalle;
        gdvDetalleOC.DataBind();
        SeteaTotal(((OrdenDeCompra)Session["OC"]));

        txbValorUnitario.Text = string.Empty;
        txbCantidad.Text = string.Empty;
        btnFinalizar.Enabled = gdvDetalleOC.Rows.Count > 0;
        ddlFamilia.SelectedIndex = 0;
        ddlProducto.SelectedIndex = 0;
        

    }

    private void SeteaTotal(OrdenDeCompra oc)
    {
        long montoTotal = 0;
        foreach (DetalleOrdenDeCompra d in oc.Detalle)
        {
            montoTotal = montoTotal + d.ValorTotal;   
        }
        ((Label) gdvDetalleOC.FooterRow.FindControl("lblTotal")).Text = montoTotal.ToString();
    }

    protected void btnFinalizar_Click(object sender, EventArgs e)
    {
        oc = ((OrdenDeCompra)Session["OC"]);
        if (lbxOrdenes.SelectedIndex<0)
        {
            oc.Fecha = DateTime.Now;
            //oc.NumeroOrdenDeCompra = int.Parse(txbNumeroOC.Text);
            oc.Proveedor = mantenedorProveedor.Obtener(int.Parse(ddlProveedor.SelectedValue));
            gestionOrdenDeCompra.GuardarOrdenDeCompra(oc);

        }
        else
        {
            oc.EstadoOrdenDeCompra = mantenedorEstadoOrdenDeCompra.Buscar("I")[0];
            gestionOrdenDeCompra.Modificar(oc);
        }

       
       
        Limpiar();
        CargarListaOrdenes();
        btnFinalizar.Enabled = gdvDetalleOC.Rows.Count > 0;
    }

    private void Limpiar()
    {
        lbxOrdenes.SelectedIndex = -1;
        txbValorUnitario.Text = string.Empty;
        txbNumeroOC.Text = string.Empty;
        txbCantidad.Text = string.Empty;

        gdvDetalleOC.DataSource = null;
        gdvDetalleOC.DataBind();
    }

    protected void gdvDetalleOC_SelectedIndexChanged(object sender, EventArgs e)
    {
        oc = ((OrdenDeCompra)Session["OC"]);
        oc.Detalle.RemoveAt(gdvDetalleOC.SelectedIndex);
        gdvDetalleOC.DataSource = oc.Detalle;
        gdvDetalleOC.DataBind();
        SeteaTotal(oc);
    }

    protected void gdvDetalleOC_SelectedIndexChanged2(object sender, EventArgs e)
    {
        oc = ((OrdenDeCompra)Session["OC"]);
        oc.Detalle.RemoveAt(gdvDetalleOC.SelectedIndex);
        gdvDetalleOC.DataSource = oc.Detalle;
        gdvDetalleOC.DataBind();
        SeteaTotal(oc);
    }
    protected void lbxOrdenes_SelectedIndexChanged(object sender, EventArgs e)
    {
        CargaOrden();
    }

    private void CargaOrden()
    {
        OrdenDeCompra oc = gestionOrdenDeCompra.Obtener(int.Parse(lbxOrdenes.SelectedValue.ToString()));
        lblFecha.Text = oc.Fecha.ToShortDateString();
        txbNumeroOC.Text = oc.Id.ToString();
        //ddlProveedor.SelectedValue = oc.Proveedor.Id;
        //.Text = oc.MontoTotal.ToString();
        lblFecha.Text = oc.Fecha.ToShortDateString();
        gdvDetalleOC.DataSource = oc.Detalle;
        gdvDetalleOC.DataBind();
        SeteaTotal(oc);

        Session["OC"] = oc;
        Session["ORDENDECOMPRA"] = oc;
        btnFinalizar.Enabled = true;
    }
    protected void btnNuevo_Click(object sender, EventArgs e)
    {
       
        Limpiar();
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        oc = (OrdenDeCompra) Session["OC"];
        gestionOrdenDeCompra.Eliminar(oc);
        CargarListaOrdenes();
        Limpiar();
    }



    protected void LinkButton1_Click(object sender, EventArgs e)
    {
        oc = gestionOrdenDeCompra.Obtener(int.Parse(lbxOrdenes.SelectedValue.ToString()));
        int id = int.Parse(((LinkButton)(sender)).CommandArgument.ToString());
        DetalleOrdenDeCompra doc = null;
        foreach (DetalleOrdenDeCompra d in oc.Detalle)
            if (d.Id == id)
                doc = d;

        Session["DETALLEOCEDICION"] = doc;
        ddlFamilia.SelectedValue = doc.Producto.Familia.Id.ToString();
        ddlProducto.Items.Clear();
        ListItem li = new ListItem(doc.Producto.Codigo +"-"+doc.Producto.Nombre,doc.Producto.Id.ToString());
        ddlProducto.Items.Insert(0,li);
         
        txbCantidad.Text = doc.Cantidad.ToString();
        txbValorUnitario.Text = doc.ValorUnitario.ToString();
    }
}
